package PizzaEnvenenada;


import java.util.Vector;

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

/**
 *
 * @author jefferpc
 */
public  class ArbolMinMaxPizza {
    
    //0 si no es aleatori, 1 si es aleatorio
    int estado;
    Vector <Nodo> pila;
    Vector <Nodo> nodosExpandidos;
    public ArbolMinMaxPizza()
    {
        

        
    }
    public void calcularUtilidad(Nodo hoja)
    {
        
        if(hoja.getNombre().equals("MAX"))
        {
            hoja.setUtilidad((double)(estado-hoja.getProfundidad()),"");
        }
        if(hoja.getNombre().equals("MIN"))
        {
            hoja.setUtilidad((double)(estado-hoja.getProfundidad())*-1, "");
        }
    }
   public void inicializar(int estado)
    {
        pila=new Vector<Nodo>();
        nodosExpandidos=new Vector<Nodo>();
        setEstado(estado);
   }
   public String tomarDecision()
    {
       String decision="";
       Nodo cabezaPila=null;
       pila.add(new Nodo("MAX", null,this.estado,0));
       while(pila.size()>0)
       {
            cabezaPila=pila.firstElement();
            if(termino(cabezaPila))
            {
                calcularUtilidad(cabezaPila);
            }
            else
            {
                //expandir
                String nombreNuevo="";
                if(cabezaPila.getNombre().equals("MAX"))
                    nombreNuevo="MIN";
                if(cabezaPila.getNombre().equals("MIN"))
                    nombreNuevo="MAX";
                int profund=cabezaPila.getProfundidad()+1;
                if((cabezaPila.getEstadoJuego()-3)>=0)
                {
                     
                    int est=(cabezaPila.getEstadoJuego()-3);
                    
                    pila.add(new Nodo(nombreNuevo, cabezaPila,est,profund));
                }
                if((cabezaPila.getEstadoJuego()-2)>=0)
                {
                    int est=(cabezaPila.getEstadoJuego()-2);
                    
                    pila.add(new Nodo(nombreNuevo, cabezaPila,est,profund));
                }
                if((cabezaPila.getEstadoJuego()-1)>=0)
                {
                    int est=(cabezaPila.getEstadoJuego()-1);
                    
                    pila.add(new Nodo(nombreNuevo, cabezaPila,est,profund));
                }
            }
            //System.out.println("CAbezza"+cabezaPila.getNombre()+" "+cabezaPila.getUtilidad()+" "+cabezaPila.getProfundidad()+" "+cabezaPila.getEstadoJuego());
            
            pila.remove(cabezaPila);
            insertarNodo(cabezaPila);
       }
       int x=nodosExpandidos.elementAt(0).getProfundidad();
       for(int i=0;i<nodosExpandidos.size();i++)
       {
           /*if(x!=nodosExpandidos.elementAt(i).getProfundidad())
           {
               x=nodosExpandidos.elementAt(i).getProfundidad();
               System.out.println();
           }*/
           nodosExpandidos.elementAt(i).reportarUtilidadPadre();
           //System.out.print(nodosExpandidos.elementAt(i).getEstadoJuego()+"=>"+nodosExpandidos.elementAt(i).getUtilidad()+"\t");

       }
       decision=nodosExpandidos.lastElement().getDecision();
       //    System.out.println(cabezaPila.getUtilidad());
       
       return decision;
   }
    
    public void insertarNodo(Nodo nuevoNodo)
    {
        int pos=0;
        for(int i=0;i<nodosExpandidos.size();i++)
        {
            if(nodosExpandidos.elementAt(i).getProfundidad()<nuevoNodo.getProfundidad())
            {
                pos=i; break;
            }
        }
        nodosExpandidos.add(pos, nuevoNodo);



    }
    public boolean termino(Nodo tmp)
    {
        if(tmp.getEstadoJuego()==0)
            return true;
        return false;
    }
    public int getEstado() {
        return estado;
    }

    public void setEstado(int estado) {
        this.estado = estado;
    }
}
